package com.zw.pdm.module.system.service;

import com.zw.pdm.constant.Constant;
import com.zw.pdm.entity.sys.Role;
import com.zw.pdm.module.system.mapper.RoleMapper;
import com.zw.pdm.module.system.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import static com.zw.pdm.constant.Constant.STATUS_NORMAL;


/**
 * @Description:
 *
 * @Author: China.sgl
 * @Date: 2019/9/16 09:11
 */
@Service
@SuppressWarnings("all")
public class RoleService {

    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private RoleRepository roleRepository;

    /**
     * 按 用户ID 查询角色
     *
     * @param id 用户 id
     * @return list
     */
    public List<Role> findRoleByUserId(Integer id) {
        return roleMapper.findByUserId(id);
    }

    /**
     * 按条件查询角色
     *
     * @param role 条件
     * @return list
     */
    public List<Role> findRoleByCondition(Role role) {
        return roleMapper.findByCondition(role);
    }

    /**
     * 删除角色
     *
     * @param id 角色id
     * @return 行数
     */
    public int delRole(Integer id) {
        return roleMapper.updateStatusByIdWithRecursion(id, Constant.STATUS_DELETE);
    }

    /**
     * 按角色名查询角色
     *
     * @param name 角色名
     * @return 角色信息
     */
    public Role findRoleByName(String name) {
        return roleMapper.findByName(name);
    }

    /**
     * 保存角色信息
     *
     * @param role    角色信息
     * @param menuIds 权限 id 数组
     * @return role
     */
    @Transactional(rollbackFor = Exception.class)
    public Role saveRole(Role role, Integer[] menuIds) {
        role.setStatus(STATUS_NORMAL);
        Role r = roleRepository.save(role);
        if (menuIds != null && menuIds.length > 0) {
            roleMapper.batchInsertRoleMenu(r.getId(), menuIds);
        }
        return r;
    }

    /**
     * 修改角色及拥有权限
     *
     * @param role          角色信息
     * @param menuIds 拥有权限ID
     * @return role
     */
    @Transactional(rollbackFor = Exception.class)
    public Role updateRole(Role role, Integer[] menuIds) {
        role.setStatus(STATUS_NORMAL);
        Role r = roleRepository.saveAndFlush(role);
        roleMapper.deleteRoleMenuByRoleId(role.getId());
        if (menuIds != null && menuIds.length > 0) {
            roleMapper.batchInsertRoleMenu(role.getId(), menuIds);
        }
        return r;
    }

    /**
     * 查询所有角色，标识帐户拥有角色
     *
     * @param id 用户id
     * @return 角色集合
     */
    public List<Role> findRoleCheckedByUserId(Integer id) {
        List<Role> all = roleMapper.findByCondition(new Role());
        List<Role> userRole = roleMapper.findByUserId(id);
        for (Role r : all) {
            for (Role role : userRole) {
                if (r.getId().equals(role.getId())) {
                    r.setCheckFlag(true);
                    break;
                }
            }
        }
        return all;
    }

    /**
     * 按主键查询角色
     *
     * @param id 主键
     * @return 角色
     */
    public Role findRoleById(Integer id) {
        return roleRepository.getOne(id);
    }
}
